package org.example.Thread01;

public class Dome_Thread09 {
    public static void main(String[] args) {
//        SingletonHungry instance1=SingletonHungry.getInstance();
//        System.out.println(instance1);
//        SingletonHungry instance2=SingletonHungry.getInstance();
//        System.out.println(instance2);
//        SingletonHungry instance3=SingletonHungry.getInstance();
//        System.out.println(instance3);
        for(int i=0;i<10;i++){
            Thread t = new Thread(()->{
                SingletonLazy instance=SingletonLazy.getInstance();
                System.out.println(instance);
            });
            t.start();
        }
    }
}

/**
 * 饿汉模式
 */
class SingletonHungry{
    //定义一个类的成员变量，用static修饰，保证全局唯一
    private static volatile SingletonHungry instance=new SingletonHungry();
    //构造方法私有化
    private SingletonHungry(){

    }
    //提供一个共有的方法返回instance对象
    public static SingletonHungry getInstance() {
        //返回全局唯一的对象
        return instance;
    }
}
/**
 * 懒汉模式
 */
class SingletonLazy{
    private static volatile SingletonLazy instance=null;
    //构造方法私有化
    private SingletonLazy(){

    }

    public static SingletonLazy getInstance() {
        //第一次判断是否需要加锁
        if(instance==null){
            synchronized (SingletonLazy.class){
                //判断是否创建过对象
                if(instance==null){
                    //创建对象
                    instance=new SingletonLazy();
                }
            }
        }
        return instance;
    }
}
